package com.seedog.mq.distributed;

import java.util.List;
import java.util.Set;

/**
 * 集群管理器接口，用于管理分布式集群中的节点和协调它们之间的通信
 */
public interface ClusterManager {
    /**
     * 初始化集群管理器
     * @param config 分布式配置
     */
    void initialize(DistributedConfig config);
    
    /**
     * 获取当前集群中的所有节点
     * @return 节点列表
     */
    List<Node> getAllNodes();
    
    /**
     * 获取当前活跃的节点
     * @return 活跃节点列表
     */
    List<Node> getActiveNodes();
    
    /**
     * 获取主节点
     * @return 主节点，如果没有主节点则返回null
     */
    Node getMasterNode();
    
    /**
     * 获取当前节点
     * @return 当前节点
     */
    Node getCurrentNode();
    
    /**
     * 检查当前节点是否为主节点
     * @return 是否为主节点
     */
    boolean isMaster();
    
    /**
     * 加入集群
     * @param seedNodes 种子节点列表，用于发现集群
     * @return 是否加入成功
     */
    boolean joinCluster(List<String> seedNodes);
    
    /**
     * 离开集群
     * @return 是否离开成功
     */
    boolean leaveCluster();
    
    /**
     * 发送消息到集群中的所有节点
     * @param message 要发送的消息
     */
    void broadcastMessage(Object message);
    
    /**
     * 发送消息到指定节点
     * @param nodeId 节点ID
     * @param message 要发送的消息
     * @return 是否发送成功
     */
    boolean sendMessageToNode(String nodeId, Object message);
    
    /**
     * 注册消息处理器
     * @param messageType 消息类型
     * @param messageHandler 消息处理器
     */
    void registerMessageHandler(String messageType, MessageHandler messageHandler);
    
    /**
     * 启动集群管理器
     */
    void start();
    
    /**
     * 停止集群管理器
     */
    void stop();
    
    /**
     * 消息处理器接口
     */
    interface MessageHandler {
        /**
         * 处理接收到的消息
         * @param senderNodeId 发送者节点ID
         * @param message 消息内容
         */
        void handleMessage(String senderNodeId, Object message);
    }
}